home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 06 - 1990 / 06.02 Feb 90 / Mouse Source / TrackScroll.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-07-22  |  2.6 KB  |  114 lines  |  [TEXT/KAHL]

  1. /*                                            TrackScroll.c                                            */
  2. /*
  3.  * Copyright © 1989 Martin Minow. All rights reserved.
  4.  *
  5.  * void
  6.  * TrackScroll(horiz, vert,  track_handle)
  7.  * LONGINT            horiz;
  8.  * LONGINT            vert;
  9.  * TrackHandle    track_handle;
  10.  *
  11.  * Scroll the TrackRecord text.  Both values are in
  12.  * pixels.
  13.  *
  14.  * void
  15.  * TrackPinScroll(horiz, vert, track_handle)
  16.  * LONGINT            horiz;
  17.  * LONGINT            vert;
  18.  * TrackHandle    track_handle;
  19.  *
  20.  * Like TrackScroll, but stop scrolling when the last line
  21.  * is visible.
  22.  */
  23.  
  24. #include    "TrackEdit.h"
  25. #define TR    (*tr)
  26. #define abs(x)    ((x) < 0 ? (-(x)) : (x))
  27. #define height(r)    ((r).bottom - (r).top)
  28. #define width(r) ((r).right - (r).left)
  29. #define pin(delta, current, max) (                                \
  30.         (delta < 0) ? ((current <= 0)     ? 0 : delta)        \
  31.                                 : ((current >= max) ? 0 : delta)    \
  32.     )
  33.  
  34. void
  35. TrackScroll(hscroll, vscroll, track_handle)
  36. LONGINT            hscroll;
  37. LONGINT            vscroll;
  38. TrackHandle    track_handle;
  39. {
  40.         register TrackPtr    tr;
  41.         _Track_state            state;
  42.         
  43.         tr = _Track_lock(track_handle, &state);
  44.         _Track_do_scroll(tr, hscroll, vscroll);
  45.         _Track_unlock(&state);
  46. }
  47.  
  48. void
  49. TrackPinScroll(hscroll, vscroll, track_handle)
  50. LONGINT            hscroll;
  51. LONGINT            vscroll;
  52. TrackHandle    track_handle;
  53. {
  54.         register TrackPtr    tr;
  55.         _Track_state            state;
  56.         LONGINT                        hmax, vmax;
  57.         
  58.         tr = _Track_lock(track_handle, &state);
  59.         hmax = TR.lineWidth - width(TR.viewRect);
  60.         vmax = (TR.nLines * TR.lineHeight)
  61.                  + TR.fontDescent
  62.                  - height(TR.viewRect);
  63.         vscroll = pin(vscroll, TR.topPixel, vmax);
  64.         if (TR.crOnly >= 0)
  65.             hscroll = pin(hscroll, TR.leftPixel, hmax);
  66.         else if (hscroll < 0 && TR.leftPixel <= 0)
  67.             hscroll = 0;
  68.         _Track_do_scroll(tr, hscroll, vscroll);
  69.         _Track_unlock(&state);
  70. }
  71.  
  72. void
  73. _Track_do_scroll(tr, hscroll, vscroll)
  74. register TrackPtr    tr;
  75. LONGINT                        hscroll;
  76. LONGINT                        vscroll;
  77. {
  78.         RgnHandle                    old_clip;
  79.         RgnHandle                    scroll_region;
  80.         Rect                            scroll_rect;
  81.  
  82.         /*
  83.          * Save the old clip region so we can be called
  84.          * multiple times between update events.  This
  85.          * is needed for autoscrolling.
  86.          */
  87.         old_clip = NewRgn();
  88.         GetClip(old_clip);
  89.         scroll_region = NewRgn();
  90.         TR.topPixel += vscroll;
  91.         TR.leftPixel += hscroll;
  92.         if (abs(vscroll) > height(TR.viewRect)
  93.          || abs(hscroll) > width(TR.viewRect)) {
  94.             EraseRect(&TR.viewRect);
  95.             scroll_rect = TR.viewRect;
  96.             RectRgn(scroll_region, &scroll_rect);
  97.         }
  98.         else {
  99.             ScrollRect(
  100.                 &TR.viewRect,
  101.                 (INTEGER) -hscroll,
  102.                 (INTEGER) -vscroll,
  103.                 scroll_region
  104.             );
  105.             scroll_rect = (*scroll_region)->rgnBBox;
  106.             SetClip(scroll_region);
  107.         }
  108.         _Track_do_update(tr, &scroll_rect);
  109.         ValidRgn(scroll_region);
  110.         DisposeRgn(scroll_region);
  111.         SetClip(old_clip);
  112.         DisposeRgn(old_clip);
  113. }
  114.